package com.example.demo.convert;

import com.example.demo.bean.bo.Student1BO;
import com.example.demo.bean.bo.Student2BO;
import com.example.demo.bean.bo.StudentBO;
import com.example.demo.bean.po.Student;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.NullValuePropertyMappingStrategy;
import org.mapstruct.factory.Mappers;

import java.util.List;

/**
 * @author lyc
 * @date 2019/6/5.
 * @Mapping 只有在接口加上这个注解， MapStruct 才会去实现该接口    @Mapper 里有个 componentModel 属性，主要是指定实现类的类型，一般用到两个    default：默认，可以通过 Mappers.getMapper(Class) 方式获取实例对象
    spring：在接口的实现类上自动添加注解 @Component，可通过 @Autowired 方式注入@Mapping：属性映射，若源对象属性与目标对象名字一致，会自动映射对应属性
    source：源属性
    target：目标属性
    dateFormat：String 到 Date 日期之间相互转换，通过 SimpleDateFormat，该值为 SimpleDateFormat              的日期格式
    ignore: 忽略这个字段@Mappings：配置多个@Mapping@MappingTarget 用于更新已有对象@InheritConfiguration 用于继承配置
    本文只是写了一些常用的比较简单的一些功能，更详细的可以去阅读官方文档：  http://mapstruct.org/documentation/stable/reference/html/
 *   https://www.jb51.net/article/157763.htm 自定义转换
 *
 */
@Mapper
public interface Student2StudentBOMapper {
    Student2StudentBOMapper MAPPER = Mappers.getMapper(Student2StudentBOMapper.class);

    @Mappings({})
    StudentBO get(Student student);
    //,expression = "java(java.lang.String.valueOf(student.getSex()))"
    @Mappings({
            @Mapping(source = "id",target = "id")
    })
    Student1BO get1(Student student);

    @Mappings({})
    Student1BO get3(Student student);

    @Mappings({
            @Mapping(source = "id",target = "id"),
            @Mapping(source = "date",target = "date",dateFormat = "yyyy-MM-dd"),
            //表达式expression 不要设置 sources 不然报错
            @Mapping(expression = "java(com.example.demo.utils.SexUtils.getSex(student.getSex()))",target = "sex")
    })
    Student2BO get2(Student student);

    /**
     * 会直接参照 对象的模式 写 @Mapping 会报错 想想也是 为啥要重复设置关联关系呢？
     * @param student
     * @return
     */
    @Mappings({})
    List<Student2BO> get4(List<Student> student);
}